package br.com.wssa.smmb.controller;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;
import javax.validation.Valid;

import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.servlet.ModelAndView;

import br.com.wssa.smmb.dao.PermissaoUsuarioDAO;
import br.com.wssa.smmb.dao.UsuarioDAO;
import br.com.wssa.smmb.dto.MensagemDTO;
import br.com.wssa.smmb.entidades.Usuario;

/**
 * Classe UsuarioController.
 * @author ssilva
 */
@Controller("usuario")
@SessionAttributes("usuario")
public class UsuarioController {

	@Autowired
	private UsuarioDAO daoUsuario;

	@Autowired
	private PermissaoUsuarioDAO daoPermissaoUsuario;



	/**
	 * @param usuario
	 * @param bindingResult
	 * @param sessao
	 * @return
	 */
	@RequestMapping(value = "/incluirUsuario", method = RequestMethod.POST)
	public ModelAndView incluirUsuario(@Valid Usuario usuario, BindingResult bindingResult, HttpSession sessao) {
		if (bindingResult.hasErrors()) {
			Map<String, Object> model = new HashMap<String, Object>();
			model.put("usuario", usuario);
			return new ModelAndView("/registro", model);
		}
		ModelAndView modelView = new ModelAndView("/registro");
		MensagemDTO mensagem = new MensagemDTO();
		modelView.addObject("j_username", usuario.getLogin());
		modelView.addObject("j_password", usuario.getSenha());
		boolean registroInvalido = registroInvalido(usuario, mensagem);
		modelView.addObject("registroInvalido", registroInvalido);
		modelView.addObject("mensagem", mensagem);
		if (!registroInvalido) {
			daoUsuario.persistir(usuario);
			daoPermissaoUsuario.addRole("ROLE_MEMBRO", usuario);
		}
/*		List<PermissaoUsuario> permissoes = getDaoPermissaoUsuario().getPermissoesUsuario(usuario);
		SecurityAuthentication resultado = new SecurityAuthentication(usuario, permissoes);
		resultado.setAuthenticated(usuario != null);
		usuario = daoUsuario.getUsuario(usuario.getLogin(), usuario.getSenha());
		sessao.setAttribute("SPRING_SECURITY_CONTEXT", resultado);
		sessao.getAttribute("SPRING_SECURITY_CONTEXT");
		sessao.setAttribute("usuario", usuario);*/
		
		return modelView;
	}

	private boolean registroInvalido(Usuario usuario, MensagemDTO mensagem) {
		boolean loginInvalido = false;
		StringBuilder erro = new StringBuilder();
		if (!usuario.getSenha().equals(usuario.getConfirmaSenha())) {
			erro.append("Confirmação da Senha Inválida!");
			loginInvalido = true;
		}
		if (daoUsuario.getUsuario(usuario.getLogin()) != null) {
			erro.append("Login existente!");
			loginInvalido = true;
		} else if (daoUsuario.obterUsuarioPorEmail(usuario.getEmail()) != null) {
			erro.append("Email já existente!");
			loginInvalido = true;
		}
		if(StringUtils.isNotBlank(erro.toString())){
			mensagem.setMsgErro(erro.toString());
		}
		return loginInvalido;
	}
	
	/**
	 * @return
	 */
	public UsuarioDAO getDaoUsuario() {
		return daoUsuario;
	}

	/**
	 * @param daoUsuario
	 */
	public void setDaoUsuario(UsuarioDAO daoUsuario) {
		this.daoUsuario = daoUsuario;
	}

	/**
	 * @return
	 */
	public PermissaoUsuarioDAO getDaoPermissaoUsuario() {
		return daoPermissaoUsuario;
	}

	/**
	 * @param daoPermissaoUsuario
	 */
	public void setDaoPermissaoUsuario(PermissaoUsuarioDAO daoPermissaoUsuario) {
		this.daoPermissaoUsuario = daoPermissaoUsuario;
	}
}